Get Bitcoin data

btc <- getSymbols(Symbols="BTC-CAD", auto.assign=FALSE)
## remove today
btc <- btc[1:nrow(btc)-1,]
summary(btc)
##      Index             BTC-CAD.Open    BTC-CAD.High    BTC-CAD.Low   
##  Min.   :2019-09-18   Min.   : 6996   Min.   : 7439   Min.   : 5721  
##  1st Qu.:2020-03-15   1st Qu.:12116   1st Qu.:12342   1st Qu.:11889  
##  Median :2020-09-10   Median :14898   Median :15137   Median :14762  
##  Mean   :2020-09-10   Mean   :28215   Mean   :29007   Mean   :27358  
##  3rd Qu.:2021-03-08   3rd Qu.:44564   3rd Qu.:46275   3rd Qu.:42364  
##  Max.   :2021-09-03   Max.   :79624   Max.   :81446   Max.   :77726  
##                       NA's   :4       NA's   :4       NA's   :4      
##  BTC-CAD.Close   BTC-CAD.Volume      BTC-CAD.Adjusted
##  Min.   : 6931   Min.   :1.625e+10   Min.   : 6931   
##  1st Qu.:12120   1st Qu.:2.990e+10   1st Qu.:12120   
##  Median :14902   Median :4.382e+10   Median :14902   
##  Mean   :28280   Mean   :4.867e+10   Mean   :28280   
##  3rd Qu.:44604   3rd Qu.:6.135e+10   3rd Qu.:44604   
##  Max.   :79598   Max.   :4.471e+11   Max.   :79598   
##  NA's   :4       NA's   :4           NA's   :4

Take a look

## basic chart_Series from quantmod
chart_Series(Cl(btc))

btc45d <- tail(btc, n=45)
summary(btc45d[,1:4])
##      Index             BTC-CAD.Open    BTC-CAD.High    BTC-CAD.Low   
##  Min.   :2021-07-21   Min.   :37769   Min.   :40989   Min.   :37451  
##  1st Qu.:2021-08-01   1st Qu.:49832   1st Qu.:51287   1st Qu.:48454  
##  Median :2021-08-12   Median :56658   Median :58467   Median :55830  
##  Mean   :2021-08-12   Mean   :54635   Mean   :56284   Mean   :53494  
##  3rd Qu.:2021-08-23   3rd Qu.:59953   3rd Qu.:61949   3rd Qu.:58957  
##  Max.   :2021-09-03   Max.   :63242   Max.   :64202   Max.   :62110  
##  BTC-CAD.Close  
##  Min.   :40369  
##  1st Qu.:49862  
##  Median :57028  
##  Mean   :55203  
##  3rd Qu.:60098  
##  Max.   :63260
chart_Series(btc45d)

Get Ethereum data

eth <- getSymbols(Symbols="ETH-CAD", auto.assign=FALSE)
## remove today - empty
eth <- eth[1:nrow(eth)-1,]
summary(eth)
##      Index             ETH-CAD.Open     ETH-CAD.High     ETH-CAD.Low    
##  Min.   :2019-09-18   Min.   : 154.6   Min.   : 164.6   Min.   : 132.5  
##  1st Qu.:2020-03-15   1st Qu.: 266.7   1st Qu.: 269.5   1st Qu.: 254.8  
##  Median :2020-09-10   Median : 500.9   Median : 511.1   Median : 485.1  
##  Mean   :2020-09-10   Mean   :1192.0   Mean   :1239.3   Mean   :1142.1  
##  3rd Qu.:2021-03-08   3rd Qu.:2246.6   3rd Qu.:2304.6   3rd Qu.:2142.5  
##  Max.   :2021-09-03   Max.   :5050.3   Max.   :5267.4   Max.   :4693.3  
##                       NA's   :4        NA's   :4        NA's   :4       
##  ETH-CAD.Close    ETH-CAD.Volume      ETH-CAD.Adjusted
##  Min.   : 154.9   Min.   :6.923e+09   Min.   : 154.9  
##  1st Qu.: 266.6   1st Qu.:1.365e+10   1st Qu.: 266.6  
##  Median : 501.1   Median :2.049e+10   Median : 501.1  
##  Mean   :1198.4   Mean   :2.457e+10   Mean   :1198.4  
##  3rd Qu.:2248.3   3rd Qu.:3.121e+10   3rd Qu.:2248.3  
##  Max.   :5043.1   Max.   :1.025e+11   Max.   :5043.1  
##  NA's   :4        NA's   :4           NA's   :4

Take a look

## basic chart_Series from quantmod
chart_Series(Cl(eth))

Zoom in recent periods

  • 90d
eth90d <- tail(eth, n=90)
summary(eth90d[,1:4])
##      Index             ETH-CAD.Open   ETH-CAD.High   ETH-CAD.Low  
##  Min.   :2021-06-06   Min.   :2226   Min.   :2274   Min.   :2114  
##  1st Qu.:2021-06-28   1st Qu.:2655   1st Qu.:2734   1st Qu.:2564  
##  Median :2021-07-20   Median :2949   Median :3064   Median :2851  
##  Mean   :2021-07-20   Mean   :3175   Mean   :3289   Mean   :3067  
##  3rd Qu.:2021-08-11   3rd Qu.:3902   3rd Qu.:4055   3rd Qu.:3754  
##  Max.   :2021-09-03   Max.   :4828   Max.   :5033   Max.   :4693  
##  ETH-CAD.Close 
##  Min.   :2229  
##  1st Qu.:2658  
##  Median :2946  
##  Mean   :3195  
##  3rd Qu.:3933  
##  Max.   :4936
chart_Series(eth90d)

  • 45d
eth45d <- tail(eth, n=45)
summary(eth45d[,1:4])
##      Index             ETH-CAD.Open   ETH-CAD.High   ETH-CAD.Low  
##  Min.   :2021-07-21   Min.   :2264   Min.   :2544   Min.   :2231  
##  1st Qu.:2021-08-01   1st Qu.:3144   1st Qu.:3286   1st Qu.:3065  
##  Median :2021-08-12   Median :3928   Median :4058   Median :3760  
##  Mean   :2021-08-12   Mean   :3643   Mean   :3784   Mean   :3547  
##  3rd Qu.:2021-08-23   3rd Qu.:4087   3rd Qu.:4166   3rd Qu.:3979  
##  Max.   :2021-09-03   Max.   :4828   Max.   :5033   Max.   :4693  
##  ETH-CAD.Close 
##  Min.   :2503  
##  1st Qu.:3164  
##  Median :3933  
##  Mean   :3702  
##  3rd Qu.:4095  
##  Max.   :4936
chart_Series(eth45d)

Correlation: BTC, ETH

kryptos <- merge(btc, eth, join='outer', fill=NA)
kryptos2017 <- kryptos['2017-01-01/'] 
chart_Series(kryptos[,c(4,8)])

kryptos_all <- kryptos
kryptos <- kryptos["2017-01-01/"]
chart.Correlation(kryptos[,c(4,10)], histogram=TRUE)

Explore Correlation

df_kryptos <- as.data.frame(kryptos)
df_kryptos$date <- row.names(df_kryptos)
df_kryptos %>% ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point()

df_kryptos <- df_kryptos %>% mutate(
  yr=year(date),
  mth=month(date)
)
df_kryptos %>% ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close, color=as.factor(yr)))+geom_point()

Correlations vary by year. Of most relevance in most recent yr correlation.

2020

df_kryptos_2020 <- df_kryptos %>% filter(date>='2020-01-01' & date<='2020-12-31')
df_kryptos_2020 %>%
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point()+
  geom_smooth(method='lm')

By Month

df_kryptos_2020 %>%
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close, color=as.factor(mth)))+geom_point()+
  geom_smooth(method='lm')

df_kryptos_2020 %>% 
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point(aes(color=as.factor(mth)))+
  geom_smooth(method='lm')

chart.Correlation(df_kryptos_2020[,c(2,3,4,5,8,9,10,11)], histogram=TRUE)

2021

df_kryptos_2021 <- df_kryptos %>% filter(date>='2021-01-01' & date<='2021-12-31')
df_kryptos_2021 %>%
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point()+
  geom_smooth(method='lm')

By Month

df_kryptos_2021 %>%
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close, color=as.factor(mth)))+geom_point()+
  geom_smooth(method='lm')

df_kryptos_2021 %>% 
  ggplot(aes(x=BTC.CAD.Close, y=ETH.CAD.Close))+geom_point(aes(color=as.factor(mth)))+
  geom_smooth(method='lm')

Distribution

2020

Prices

BTC
df_kryptos_2020 %>% ggplot(aes(x=as.factor(mth), y=BTC.CAD.Close))+geom_boxplot()

ETH
df_kryptos_2020 %>% ggplot(aes(x=as.factor(mth), y=ETH.CAD.Close))+geom_boxplot()

Returns

BTC
kryptos2020 <- kryptos_all["2020-01-01/2020-12-31"]
kryptos2020_btc_ret <- dailyReturn(kryptos2020$BTC.CAD.Close)
dygraph(kryptos2020_btc_ret)
kryptos2020_btc_ret %>% ggplot(aes(x=.))+geom_histogram()+
  geom_vline(xintercept = mean(kryptos2020_btc_ret))

ETH
kryptos2020 <- kryptos_all["2020-01-01/2020-12-31"]
kryptos2020_eth_ret <- dailyReturn(kryptos2020$ETH.CAD.Close)
dygraph(kryptos2020_eth_ret)
kryptos2020_eth_ret %>% ggplot(aes(x=.))+geom_histogram()+
  geom_vline(xintercept = mean(kryptos2020_eth_ret))

Combined
kryptos2020_ret <- merge(kryptos2020_btc_ret, kryptos2020_eth_ret, join='outer', fill=NA)

dygraph(kryptos2020_ret)
## convert to data frame for scatterplots etc
df_kryptos_2020_ret <- as.data.frame(kryptos2020_ret)
colnames(df_kryptos_2020_ret) <- c("BTC_ret","ETH_ret")
ggplot(df_kryptos_2020_ret, aes(x=BTC_ret, y=ETH_ret))+geom_point()+
  geom_smooth(method='lm')

df_kryptos_2020_ret %>% ggplot(aes(x=BTC_ret))+geom_histogram()+
  geom_vline(xintercept=sd(df_kryptos_2020_ret$BTC_ret), color='blue')+
  geom_vline(xintercept=mean(df_kryptos_2020_ret$BTC_ret), color='green')+
  geom_vline(xintercept=0-sd(df_kryptos_2020_ret$BTC_ret), color='blue')+
  geom_text(aes(label=round(sd(BTC_ret),3)), color='blue', 
                x=sd(df_kryptos_2020_ret$BTC_ret), y=70, hjust= -0.1)+
  geom_text(aes(label=round(mean(BTC_ret),3)), color='blue',
            x=mean(df_kryptos_2020_ret$BTC_ret), y=100, hjust= -0.2)

df_kryptos_2020_ret %>% ggplot(aes(x=ETH_ret))+geom_histogram()+
  geom_vline(xintercept=sd(df_kryptos_2020_ret$ETH_ret), color='blue')+
  geom_vline(xintercept=0-sd(df_kryptos_2020_ret$ETH_ret), color='blue')+
  geom_vline(xintercept=mean(df_kryptos_2020_ret$ETH_ret), color='green')+
  geom_text(aes(label=round(sd(ETH_ret),3)), color='blue', 
                x=sd(df_kryptos_2020_ret$ETH_ret), y=70, hjust= -0.1)+
  geom_text(aes(label=round(mean(ETH_ret),3)), color='green',
            x=mean(df_kryptos_2020_ret$ETH_ret), y=100, hjust= -0.2)

2021

Prices

BTC
df_kryptos_2021 %>% ggplot(aes(x=as.factor(mth), y=BTC.CAD.Close))+geom_boxplot()

ETH
df_kryptos_2021 %>% ggplot(aes(x=as.factor(mth), y=ETH.CAD.Close))+geom_boxplot()

Returns

BTC
kryptos2021 <- kryptos_all["2021-01-01/2021-12-31"]
kryptos2021_btc_ret <- dailyReturn(kryptos2021$BTC.CAD.Close)
dygraph(kryptos2021_btc_ret)
kryptos2021_btc_ret %>% ggplot(aes(x=.))+geom_histogram()+
  geom_vline(xintercept = mean(kryptos2021_btc_ret))

ETH
kryptos2021 <- kryptos_all["2021-01-01/2021-12-31"]
kryptos2021_eth_ret <- dailyReturn(kryptos2021$ETH.CAD.Close)
dygraph(kryptos2021_eth_ret)
kryptos2021_eth_ret %>% ggplot(aes(x=.))+geom_histogram()+
  geom_vline(xintercept = mean(kryptos2021_eth_ret))

Combined
kryptos2021_ret <- merge(kryptos2021_btc_ret, kryptos2021_eth_ret, join='outer', fill=NA)

dygraph(kryptos2021_ret)
## convert to data frame for scatterplots etc
df_kryptos_2021_ret <- as.data.frame(kryptos2021_ret)
colnames(df_kryptos_2021_ret) <- c("BTC_ret","ETH_ret")
ggplot(df_kryptos_2021_ret, aes(x=BTC_ret, y=ETH_ret))+geom_point()+
  geom_smooth(method='lm')

df_kryptos_2021_ret %>% ggplot(aes(x=BTC_ret))+geom_histogram()+
  geom_vline(xintercept=sd(df_kryptos_2021_ret$BTC_ret), color='blue')+
  geom_vline(xintercept=mean(df_kryptos_2021_ret$BTC_ret), color='green')+
  geom_vline(xintercept=0-sd(df_kryptos_2021_ret$BTC_ret), color='blue')+
  geom_text(aes(label=round(sd(BTC_ret),3)), color='blue', 
                x=sd(df_kryptos_2021_ret$BTC_ret), y=70, hjust= -0.1)+
  geom_text(aes(label=round(mean(BTC_ret),3)), color='blue',
            x=mean(df_kryptos_2021_ret$BTC_ret), y=100, hjust= -0.2)

df_kryptos_2021_ret %>% ggplot(aes(x=ETH_ret))+geom_histogram()+
  geom_vline(xintercept=sd(df_kryptos_2021_ret$ETH_ret), color='blue')+
  geom_vline(xintercept=0-sd(df_kryptos_2021_ret$ETH_ret), color='blue')+
  geom_vline(xintercept=mean(df_kryptos_2021_ret$ETH_ret), color='green')+
  geom_text(aes(label=round(sd(ETH_ret),3)), color='blue', 
                x=sd(df_kryptos_2021_ret$ETH_ret), y=70, hjust= -0.1)+
  geom_text(aes(label=round(mean(ETH_ret),3)), color='green',
            x=mean(df_kryptos_2021_ret$ETH_ret), y=100, hjust= -0.2)

PERIOD RETURNS

At the end of the day…what matters is what your return is at the end of the day. :)

df_kryptos_2021ytd <- df_kryptos_2021 %>% filter(date==min(date) | date==max(date)) %>% select(date, yr, mth, BTC.CAD.Close, ETH.CAD.Close) %>%
  mutate(BTC.CAD.ret=BTC.CAD.Close/lag(BTC.CAD.Close)-1,
         ETH.CAD.ret=ETH.CAD.Close/lag(ETH.CAD.Close)-1)

df_kryptos_2021ytd_lg <- df_kryptos_2021ytd %>% 
                          filter(date==max(date)) %>%
                          select(date, yr, mth, BTC.CAD.ret, ETH.CAD.ret) %>%
                          pivot_longer(cols=c(4:5),
                                      names_to='coin',
                                      values_to='ytd_return')

df_kryptos_2021ytd_lg %>% ggplot(aes(x=coin, y=ytd_return))+
                               geom_col()+
                              scale_y_continuous(labels=percent)

df_kryptos_2021ytd[,c(4:7)]
##            BTC.CAD.Close ETH.CAD.Close BTC.CAD.ret ETH.CAD.ret
## 2021-01-01      37393.09      929.7528          NA          NA
## 2021-09-03      62659.28     4935.8169   0.6756915    4.308741

MULTIPLE Currencies

Get data

ccurrency <- c("BTC-CAD", "ETH-CAD","LTC-CAD","BCH-CAD")

kryptos_multi <- NULL
for(c in ccurrency){
  kryptos_multi <- cbind(kryptos_multi,
                         getSymbols(Symbols=c, 
                                 from='2018-01-01', periodicity='daily', 
                                 auto.assign = FALSE)[,4])
}

Check correlations

chart.Correlation(kryptos_multi, histogram=TRUE)